package org.example;


import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;

/**
 *演示自定义类加载器
 * 	1、继承ClassLoader
 * 	2、复写其中的findClass(String name)
 * 		 String name 给出需要加载的class文件所在的目录
 */
public class MyClassLoader extends ClassLoader{

    //复写findClass方法
    public Class<?> findClass(String name) throws ClassNotFoundException {

        //定义io流读取指定的class文件中的数据
        System.out.println("自定义类加载中的findClass方法执行了,name="+name);
        try {
            //字节输入流，用于读取class文件中的数据
            FileInputStream fis = new FileInputStream(name);
            //ByteArrayOutputStream 它是一个输出流，会将数据写到内存中的一个byte数组中
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            //使用io的模版代码读写数据
            byte[] buf = new byte[1024];
            int len = 0;
            while( ( len = fis.read( buf ) ) != -1 ){
                baos.write(buf, 0, len);
            }
            //循环结束，已经将class文件中的数据全部读取到内存中的一个数组中
            //将数组中的内容转成Class文件对象
            byte[] bs = baos.toByteArray();

            //调用defineClass 将字节数组中的数据转成Class对象
            return defineClass(null, bs, 0, bs.length);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("获取类时出错了");
        }
    }


    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
//        System.out.println("loadClass方法执行了------name:"+name);
        return super.loadClass(name);
    }

}
